package core

import (
	"context"
	"fmt"
	"time"

	"github.com/patrickmn/go-cache"
	"github.com/redis/go-redis/v9"
	"go.uber.org/zap"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"

	"tool/global"
)

func DbObj(conf map[string]string) {
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       conf["dbUser"] + ":" + conf["dbPasswd"] + "@tcp(" + conf["dbHost"] + ":" + conf["dbPort"] + ")/" + conf["dbName"] + "?charset=utf8&parseTime=True&loc=Local", // DSN data source name
		DefaultStringSize:         256,                                                                                                                                                          // string 类型字段的默认长度
		DisableDatetimePrecision:  true,                                                                                                                                                         // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,                                                                                                                                                         // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,                                                                                                                                                         // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false,                                                                                                                                                        // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{})
	if err != nil {
		fmt.Println("数据库连接失败......")
	}
	global.Db = db
}

func RedisObj(conf map[string]string) {
	client := redis.NewClient(&redis.Options{
		Addr:     conf["redisHost"] + ":" + conf["redisPort"],
		Password: conf["redisPasswd"], // no password set
		DB:       1,                   // use default DB
	})
	pong, err := client.Ping(context.Background()).Result()
	if err != nil {
		zap.Error(err)
	} else {
		zap.L().Info(pong)
		global.Redis = client
	}
}

func CacheObj(conf map[string]string) {
	global.Cache = cache.New(3*time.Hour, 3*time.Hour)
}

func AnalyGlobal(conf map[string]string) {
	global.Conf = conf
}
